/**
 * axios全局配置
 * TODO: 拦截器全局配置，根据实际情况修改
 */
import axios from 'axios'
import store from '../store'
import router from '../router'
import { Message, Loading } from 'element-ui'
import Auth from './auth'
import _g from './global/global'


var getTokenLock = false,
    requestList = []


/**
 * 阻止短时间内的重复请求
 * @param {string} url - 当前请求地址
 * @param {function} c - 中断请求函数
 * @description 每个请求发起前先判断当前请求是否存在于RequestList中，
 *              如果存在则取消该次请求，如果不存在则加入RequestList中，
 *              当请求完成后500ms时，清除RequestList中对应的该请求。
 */
function stopRepeatRequest(url, c){
    for( let i = 0; i < requestList.length; i++){
        if(requestList[i] == url){
            console.log('stop repeat +1')
            c()
            return
        }
    }
    requestList.push(url)
}

// 超时设置
const service = axios.create({
    // 请求超时时间
    timeout: 30000
});

// baseURL
// axios.defaults.baseURL = 'http://182.61.33.224:8080/standard/api/v2/';
axios.defaults.baseURL = 'http://localhost:8080/standard-web/api/v2/'


/****************************************************************
/* axios http request 拦截器
/* @author wj
/* @param
/* @description 每次请求都为http头增加Authorization字段， 其内容为token
/*              暂时屏蔽，这里作用是校验token,traffic项目中用作校验http header
/*              中的特定id比如用户id。
/* changelog: 20180816 这里对某些url不需要进行loading动画了
/****************************************************************/
service.interceptors.request.use(
    config => {
        // 对用户人数在线请求特殊处理，不进行loading动画显示
        if (config.url == '/user/getonlinecount.shtml') {
            return config
        }
        
        let userName  = _g.getUserNameFromStorage()
        if(userName){
            config.headers["user"] = userName
        }
        
        return config
    },
    err => {
        setTimeout(() => {
          _g.closeGlobalLoading()
        }, 500)
        return Promise.reject(err);
    }
);

// http response 拦截器
// 针对响应代码确认跳转到对应页面
service.interceptors.response.use(
    response => {
        if(response.data.code == 404) {
            _g.clearUserInfo()
            _g.showMsg('请先登录', 'error')
            router.push({path: '/login'})
        } else if (response.data.code == 402) {
            _g.clearUserInfo()
            _g.showMsg('用户正在使用中，请重新登录','error')
            this.$router.push('/login')
        } else if (response.data.code == 403) {
            _g.showMsg("您没有此权限",'error')
        }else if (response.data.code == 405) {
            _g.clearUserInfo()
            Message({
                message: '非警员身份不允许访问此模块',
                type: 'error'
            })
        }else if(response.data.code != 200){
          _g.showMsg(response.data.msg, 'error')
        }
        setTimeout(() => {
          _g.closeGlobalLoading()
        }, 500)
        if(response && response.data)
          return Promise.resolve(response.data)
    },
    error => {
        console.log('error ===> ' +  error)
        setTimeout(() => {
          _g.closeGlobalLoading()
        }, 500)
        if(axios.isCancel(error)){
            console.log(error)
           // return Promise.reject("Ajax Abort: 该请求在axios拦截器中被中断")
        } else if (error.response) {
            switch (error.response.status) { // wj: 通过返回的status转到对应错误页
                case 401:
                    router.push('error/401');
                case 403:
                    router.push('error/403');
                default:
                    Message({
                        message: `服务器错误！错误代码：${error.response.status}`,
                        type: 'error'
                    })
            }
            return Promise.reject(error.response.data)
        }
    }
);

export default service;
